#!/usr/bin/env Rscript
# -*- coding: utf-8 -*-
#
# @File    : beta_boxplot.R
# @Description : 根据 beta 多样性矩阵绘制组内箱线图，并进行组间 Wilcoxon 检验

suppressPackageStartupMessages({
  library(optparse)
  library(tidyverse)
  library(ggplot2)
  library(ggpubr)
  library(rstatix)
})

# --------------------------
# 命令行参数解析
# --------------------------
option_list <- list(
  make_option(c("-i", "--input"), type="character", help="输入长表格 beta 矩阵文件 (必须包含 'Group' 和 'Distance' 列)"),
  make_option(c("-o", "--output"), type="character", help="输出统计结果文件路径 (TSV 格式)"),
  make_option(c("--pdf"), type="character", help="输出 PDF 文件路径"),
  make_option(c("--png"), type="character", help="输出 PNG 文件路径"),
  make_option(c("--width"), type="numeric", default=8, help="图宽度 (inch)"),
  make_option(c("--height"), type="numeric", default=6, help="图高度 (inch)"),
  make_option(c("--dpi"), type="numeric", default=300, help="PNG 输出分辨率")
)

opt_parser <- OptionParser(option_list=option_list)
opt <- parse_args(opt_parser)

# --------------------------
# 检查输入文件
# --------------------------
if (!file.exists(opt$input)) {
  stop("❌ 输入文件不存在: ", opt$input)
}

# --------------------------
# 读取数据
# --------------------------
data <- read.table(opt$input, sep="\t", header=TRUE, check.names=FALSE)
if (!all(c("Group", "Distance") %in% colnames(data))) {
  stop("❌ 输入文件中必须包含列: Group 和 Distance")
}

# --------------------------
# Wilcoxon 检验
# --------------------------
stat_test <- data %>%
  pairwise_wilcox_test(Distance ~ Group, p.adjust.method="BH") %>%
  add_significance("p") %>%
  add_xy_position(x="Group")

# 自动调整显著性标记高度（避免重叠）
if (nrow(stat_test) > 0) {
  step <- (max(data$Distance, na.rm=TRUE) - min(data$Distance, na.rm=TRUE)) * 0.1
  stat_test$y.position <- stat_test$y.position + seq(0, by=step, length.out=nrow(stat_test))
}

# --------------------------
# 输出统计结果文件
# --------------------------
subset_df <- data.frame(
  group1 = stat_test$group1,
  group2 = stat_test$group2,
  p = stat_test$p,
  p.adj = stat_test$p.adj
)
out_dir <- dirname(opt$output)
if (!dir.exists(out_dir)) dir.create(out_dir, recursive=TRUE)
write.table(subset_df, file=opt$output, sep="\t", row.names=FALSE, quote=FALSE)

# --------------------------
# 绘图
# --------------------------
p <- ggplot(data, aes(x=Group, y=Distance, fill=Group)) +
  geom_boxplot(width=0.6, outlier.shape=21, color="black") +
  stat_pvalue_manual(stat_test, label="p.adj.signif", tip.length=0.01) +
  theme_bw() +
  labs(
    title="Beta diversity within-group distances",
    x="Group",
    y="Bray-Curtis Distance"
  ) +
  theme(
    axis.text.x = element_text(angle=45, hjust=1),
    legend.position = "none",
    plot.margin = margin(t=20, r=10, b=10, l=10)
  ) +
  scale_y_continuous(expand=expansion(mult=c(0,0.15)))  # 顶部留白

# --------------------------
# 保存图像
# --------------------------
for (f in c(opt$pdf, opt$png)) {
  if (!dir.exists(dirname(f))) dir.create(dirname(f), recursive=TRUE)
}
ggsave(opt$pdf, plot=p, width=opt$width, height=opt$height)
ggsave(opt$png, plot=p, width=opt$width, height=opt$height, dpi=opt$dpi)

# --------------------------
# 提示信息
# --------------------------
message("✅ Beta 多样性箱线图绘制完成！")
message("📄 统计结果: ", opt$output)
message("🖼️  PDF 文件: ", opt$pdf)
message("🖼️  PNG 文件: ", opt$png)
